#include <string>
#include <argparse/argparse.hpp> //命令行参数解析
#include "add_ocr_text.h"

int main(int argc, char* argv[])
{
    //从命令行中读取各变量的值
    argparse::ArgumentParser program("add_ocr_text","0.1");
    
    program.add_argument("-i", "--input") //输入文件
        .required()
        .help("specify the input text file.")
        .nargs(1);
    
    program.add_argument("-f", "--font") //填充字体
        .required()
        .help("specify the font file.")
        .nargs(1);
    
    program.add_argument("-o", "--output") //写入 pdf 文件
        .default_value(std::string("out.pdf"))
        .help("specify the output PDF file.")
        .nargs(1);
    
    program.add_argument("-l", "--location") //图片原点位置
        .default_value( int(4) )
        .help("Specify the origin location of the image.\nlower-left:1  lower-right:2  upper-right:3  upper-left:4  ")
        .nargs(1)
        .scan<'i', int>();
    
    program.add_argument("-p", "--page") //页面类型
        .default_value(std::string("A4"))
        .help("Specify page size, such as A3, A4, A5, B3, B4, B5.")
        .nargs(1);
    
    program.add_argument("-b", "--box") //是否画出矩形文本框，用以微调文本框大小
        .default_value(false)
        .implicit_value(true)
        .help("Draw a rectangular text box to fine tune its size.")
        .nargs(0);
        
    program.add_argument("-t", "--tuning") //对文本框坐标进行微调，单位是像素，接收两个参数
        .default_value(std::vector<int>{0, 0})
        .help("Fine tune the position of the text box in pixels, x y.")
        .nargs(2)
        .scan<'i', int>();
    try
    {
        program.parse_args(argc, argv);    // Example: ./main --color orange
    }
    
    catch (const std::exception& err) 
    {
        std::cerr << err.what() << std::endl;
        std::cerr << program;
        std::exit(1);
    }
    
    
    //获取参数值对变量名
    const std::string input_name=program.get<std::string>("--input"); //输入文件
    const std::string pdf_name=program.get<std::string>("--output"); //写入 pdf 文件
    const std::string font_name=program.get<std::string>("--font"); //填充字体
    const int origin_position=program.get<int>("--location"); //图片原点位置
    const std::string page_name=program.get<std::string>("--page");
    const bool draw_rectangle_bool=program.get<bool>("--box"); //是否画出矩形文本框，用以微调文本框大小
    const int Box_x_fine_tuning=program.get<std::vector<int>>("--tuning")[0]; //对文本框坐标进行微调，单位是像素
    const int Box_y_fine_tuning=program.get<std::vector<int>>("--tuning")[1]; //注意，这里针对的是原始输入的坐标
    
    
    //判断文件是否存在
    File_existence_judgment(input_name);
    File_existence_judgment(font_name);
    
    
    /*
    //打印各参数的值
    std::cout << input_name << std::endl;
    std::cout << pdf_name << std::endl;
    std::cout << font_name << std::endl;
    std::cout << origin_position << std::endl;
    std::cout << page_name << std::endl;
    std::cout << draw_rectangle_bool << std::endl;
    std::cout << Box_x_fine_tuning << std::endl;
    std::cout << Box_y_fine_tuning << std::endl;
    */
    
    
    /*
    //手动设定各参数的值
    const std::string input_name="example.txt"; //输入文件
    const std::string pdf_name="output.pdf"; //写入 pdf 文件
    const std::string font_name="OpenSans-Regular.ttf"; //填充字体
    const int origin_position=4; //图片原点位置
    const std::string page_name="A4";
    const bool draw_rectangle_bool=false; //是否画出矩形文本框，用以微调文本框大小
    const int Box_x_fine_tuning=0; //对文本框坐标进行微调，单位是像素
    const int Box_y_fine_tuning=-2; //注意，这里针对的是原始输入的坐标
    */
    
    
    std::vector <std::string> info_picture; //存图片名
    std::vector <std::string> info_text; //存图中识别的文本
    std::vector <std::pair<int, int>> info_coord_1,info_coord_2,info_coord_3,info_coord_4; //存文本坐标
    
    
    PDFUsedFont* use_font; //在PDF使用字体的对像
    std::pair <double, double> page_size_pair; //页面尺寸
    std::vector <int> index_record; //存储图像名称索引
    std::string pic_name;
    
    //从输入文件中读取数据
    Get_date(&info_picture, &info_text, &info_coord_1, &info_coord_2, &info_coord_3, &info_coord_4, input_name,Box_x_fine_tuning,Box_y_fine_tuning);
    
    
    //将每张图片的指标范围提取出来
    pic_name=info_picture[0]; //图片最初名称
    
    index_record.push_back(0); //第一个值为 0
    
    for(long unsigned int i=0; i < info_picture.size(); i++)
    {
        if( pic_name !=  info_picture[i])
        {
            index_record.push_back(i);
            pic_name=info_picture[i];
        }
    }
    
    index_record.push_back(info_picture.size()); //最后一个值为 数组大小
    
    //判断各图片文件是否存在
    for(long unsigned int j=0; j < index_record.size()-1; j++)
    {
        File_existence_judgment( info_picture[ index_record[j] ] );
    }
    
    //
    //确认文件没问题后进行后面的操作
    //
    
    //设定页面尺寸
    page_size_pair=Get_page_size(page_name);
    
    PDFWriter pdfWriter; // PDF 操作 
    EStatusCode status;
    
    status = pdfWriter.StartPDF(pdf_name,ePDFVersion15);
    if(status != eSuccess)
    {
        std::cout << pdf_name << "：读取失败" << std::endl;
        exit(1);
    }
    
    //字体
    use_font = pdfWriter.GetFontForFile(font_name);
    
    //矩形样式
    AbstractContentContext::GraphicOptions pathStrokeOptions(AbstractContentContext::eStroke,
                                                             AbstractContentContext::eRGB,
                                                             AbstractContentContext::ColorValueForName("DarkMagenta"),
                                                             1);
    //pageContentContext->DrawRectangle(0,0,20,30,pathStrokeOptions);
    
    
    for(long unsigned int j=0; j < index_record.size()-1; j++)
    {
        Write_picture_ocr_info(page_size_pair, //页面大小
                               &pdfWriter, //PDF 写入对像
                               use_font, //PDF 字体
                               draw_rectangle_bool, // 是否画出矩形文本框
                               pathStrokeOptions, //矩形文本框样式
                               info_picture[ index_record[j] ], //图片名
                               origin_position, //OCR图片结果中坐标的原点位置
                               &info_coord_1, //相应数据
                               &info_coord_2,
                               &info_coord_3,
                               &info_coord_4,
                               &info_text,
                               index_record[j], //相关内容的索引编号
                               index_record[j+1] );
    }
    
    status = pdfWriter.EndPDF(); //PDF结束
    
    if(status == eSuccess)
        std::cout << "Succeeded in creating PDF file: " << pdf_name << std::endl;
    else
        std::cout << "Failed in creating PDF file: " << pdf_name << std::endl;
    
    return 0;
}
